import pandas as pd
import matplotlib
matplotlib.use('TkAgg')  # 根据你的环境选择 Agg、TkAgg 等
import matplotlib.pyplot as plt
from matplotlib import rcParams
import matplotlib.dates as mdates
from datetime import datetime, timedelta

# 设置中文字体和解决负号显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号 -

# 后续代码不变...
# 1. 读取CSV文件
index='000300.SH'
file_path = f"../../data/{index}_daily_data.csv"
# file_path = 'hs300_daily.csv'  # 替换为你自己的路径
df = pd.read_csv(file_path)

# 2. 处理交易日期：将形如 20250523 的字符串转为 datetime，并保留原始格式
df['trade_date_raw'] = df['trade_date'].astype(str)  # 原始字符串格式保存下来
df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')

# 按日期升序排序
df = df.sort_values('trade_date').reset_index(drop=True)

# 3. 计算60日均线
df['ma60'] = df['close'].rolling(window=60).mean()

# 4. 计算偏移度（偏离百分比）
df['deviation'] = (df['close'] - df['ma60']) / df['ma60'] * 100  # 百分比形式

# 获取当前日期并计算10年前的日期
end_date = df['trade_date'].max()
start_date = end_date - timedelta(days=10*365)

# 5. 过滤出最近10年的数据
recent_df = df[(df['trade_date'] >= start_date) & (df['trade_date'] <= end_date)]

# 输出数据到CSV文件，保留原始日期格式
output_file = '../data/hs300_ma60_deviation_last_10_years.csv'
output_columns = ['trade_date_raw', 'close', 'ma60', 'deviation']
output_df = recent_df[output_columns]
output_df = output_df.rename(columns={'trade_date_raw': 'trade_date'})  # 重命名为 trade_date
output_df.to_csv(output_file, index=False, float_format='%.2f')

print(f"最近10年的收盘价、MA60 和 偏移度数据已保存至: {output_file}")

# === 绘图部分 ===

# 6. 绘制收盘价和60日均线
plt.figure(figsize=(14, 5))
plt.plot(recent_df['trade_date'], recent_df['close'], label='沪深300 收盘点位', color='blue')
plt.plot(recent_df['trade_date'], recent_df['ma60'], label='60日均线', color='red', linestyle='--')
plt.title('沪深300 收盘价与60日均线（最近10年）')
plt.xlabel('交易日期')
plt.ylabel('点位')
plt.legend()
plt.grid(True)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())  # 每年一个刻度
plt.gcf().autofmt_xdate()
plt.tight_layout()
plt.show()

# 7. 绘制偏移度曲线
plt.figure(figsize=(14, 4))
plt.plot(recent_df['trade_date'], recent_df['deviation'], label='收盘价相对MA60的偏移度 (%)', color='purple')
plt.axhline(0, color='black', linestyle='-', linewidth=0.8)
plt.axhline(y=5, color='red', linestyle='--', linewidth=0.8, label='+5% 偏离线')
plt.axhline(y=-5, color='green', linestyle='--', linewidth=0.8, label='-5% 偏离线')
plt.title('沪深300 收盘价相对于60日均线的偏移度（最近10年）')
plt.xlabel('交易日期')
plt.ylabel('偏移度 (%)')
plt.legend()
plt.grid(True)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.gca().xaxis.set_major_locator(mdates.YearLocator())  # 每年一个刻度
plt.gcf().autofmt_xdate()
plt.tight_layout()
plt.show()